package org.example.controller;

import cn.hutool.core.util.RandomUtil;
import cn.lingyangwl.framework.core.response.Resp;
import io.swagger.annotations.*;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

/**
 * Description: Swagger常用注解使用说明
 * <code>@Api：用在请求的类上，表示对类的说明</code>
 * tags="说明该类的作用，可以在UI界面上看到的注解"
 * value="该参数没什么意义，在UI界面上也看到，所以不需要配置"
 *
 * <code>@ApiOperation：用在请求的方法上，说明方法的用途、作用</code>
 * value="说明方法的用途、作用"
 * notes="方法的备注说明"
 *
 * <code>@ApiImplicitParams：用在请求的方法上，表示一组参数说明 </code>
 * <code>   @ApiImplicitParam：用在@ApiImplicitParams注解中，指定一个请求参数的各个方面 </code>
 * name：参数名
 * value：参数的汉字说明、解释
 * required：参数是否必须传
 * paramType：参数放在哪个地方
 * · header --> 请求参数的获取：@RequestHeader
 * · query --> 请求参数的获取：@RequestParam
 * · path（用于restful接口）--> 请求参数的获取：@PathVariable
 * · body（不常用）
 * · form（不常用）
 * dataType：参数类型，默认String，其它值dataType="Integer"
 * defaultValue：参数的默认值
 *
 * <code>@ApiResponses：用在请求的方法上，表示一组响应 </code>
 * <code>    @ApiResponse：用在@ApiResponses中，一般用于表达一个错误的响应信息 </code>
 * code：数字，例如400
 * message：信息，例如"请求参数没填好"
 * response：抛出异常的类
 *
 * <code> @ApiModel：用于响应类上，表示一个返回响应数据的信息 </code>
 * （这种一般用在post创建的时候，使用@RequestBody这样的场景，
 * 请求参数无法使用@ApiImplicitParam注解进行描述的时候）
 * <code>    @ApiModelProperty：用在属性上，描述响应类的属性 </code>
 *
 * @author shenguangyang
 */
@Api(tags = "demo模块")
@RequestMapping("/demo")
@RestController
public class DemoController {

    @ApiOperation(value = "保存用户数据01")
    @PostMapping("/test1")
    public UserSaveReqDTO test1(@RequestBody UserSaveReqDTO reqDTO) {
        return UserSaveReqDTO.builder().id(reqDTO.getId())
                .password(reqDTO.getPassword()).username(reqDTO.getUsername())
                .age(reqDTO.getAge())
                .build();
    }

    @ApiOperation("保存用户信息02")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "username", value = "名字", required = true, paramType = "path"),
            @ApiImplicitParam(name = "age", dataType = "int", value = "年龄", required = true, paramType = "query")
    })
    @PostMapping("/test2/{username}")
    public UserSaveReqDTO test2(@PathVariable("username") String name, @RequestParam("age") Integer age) {
        return UserSaveReqDTO.builder().id(RandomUtil.randomNumbers(12))
                .username(name)
                .age(age)
                .build();
    }

    @ApiOperation(value = "修改密码", notes = "方法的备注说明，如果有可以写在这里")
    @ApiResponses({
            @ApiResponse(code = 400, message = "请求参数没填好"),
            @ApiResponse(code = 404, message = "请求路径找不到")
    })
    @PostMapping("/changepass")
    public Resp<String> changePassword(@RequestBody @Valid UpdatePasswordReqDTO reqDTO) {
        return Resp.ok("更新成功");
    }

    @ApiOperation(value = "用户登录", notes = "随边说点啥")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "mobile", value = "手机号", required = true, paramType = "form"),
            @ApiImplicitParam(name = "password", value = "密码", required = true, paramType = "form"),
            @ApiImplicitParam(name = "age", value = "年龄", required = true, paramType = "form", dataType = "Integer")
    })
    @PostMapping("/login")
    public Resp<?> login(@RequestParam String mobile, @RequestParam String password, @RequestParam Integer age) {
        // TODO
        return Resp.ok();
    }

    @ApiOperation("根据部门Id删除")
    @ApiImplicitParam(name = "depId", value = "部门id", required = true, paramType = "query")
    @GetMapping("/delete")
    public Resp<String> delete(String depId) {
        //TODO
        return Resp.ok(depId);
    }
}
